# Python列表基础
"""
本节内容:
1. 列表的创建，成员可各种类型
2. 索引、切片
3. 修改元素
4. 添加、插入元素
5. 删除元素
6. 是否存在某元素 in、not in
7. 列表推导式，for推导
"""

# 1. 列表的创建 - 列表是有序的集合，可包含不同类型的元素
print("=== 列表的创建 ===")
# 空列表
empty_list = []
# 数字列表
numbers = [1, 2, 3, 4, 5]
# 字符串列表
fruits = ["苹果", "香蕉", "橙子"]
# 混合类型列表
mixed = [1, "张三", 3.14, True]
# 使用list()函数创建列表
chars = list("Python")

print(f"空列表: {empty_list}")
print(f"数字列表: {numbers}")
print(f"字符串列表: {fruits}")
print(f"混合类型列表: {mixed}")
print(f"字符转列表: {chars}")

# 通过len()函数获取列表长度
print(f"列表长度: {len(fruits)}")

# 2. 索引和切片 - 访问列表元素
print("\n=== 索引和切片 ===")
# 索引从0开始
print(f"fruits的第一个元素: {fruits[0]}")
print(f"fruits的最后一个元素: {fruits[-1]}")  # 负索引从末尾开始计数

# 切片语法: list[start:end:step]
print(f"numbers的前三个元素: {numbers[0:3]}")  # 或简写为 numbers[:3]
print(f"numbers的后三个元素: {numbers[-3:]}")
print(f"numbers的第2到第4个元素: {numbers[1:4]}")
print(f"numbers的偶数索引元素: {numbers[::2]}")  # 步长为2
print(f"numbers的逆序: {numbers[::-1]}")  # 步长为-1，逆序输出

# 3. 修改列表元素
print("\n=== 修改列表元素 ===")
fruits_copy = fruits.copy()  # 创建副本以便演示
print(f"修改前: {fruits_copy}")
fruits_copy[1] = "梨"  # 修改单个元素
print(f"修改后: {fruits_copy}")
fruits_copy[0:2] = ["草莓", "西瓜"]  # 修改多个元素
print(f"修改多个后: {fruits_copy}")

# 4. 添加和插入元素
print("\n=== 添加和插入元素 ===")
# append() - 在末尾添加一个元素
cities = ["北京", "上海"]
print(f"原始城市列表: {cities}")
cities.append("广州")
print(f"添加后城市列表: {cities}")

# insert() - 在指定位置插入元素
cities.insert(1, "深圳")  # 在索引1的位置插入
print(f"插入后城市列表: {cities}")

# extend() - 添加多个元素
more_cities = ["杭州", "成都"]
cities.extend(more_cities)
print(f"扩展后城市列表: {cities}")

# 使用+=运算符扩展列表，等价于extend()
cities += ["武汉", "重庆"]
print(f"+=后城市列表: {cities}")

# 5. 删除元素
print("\n=== 删除元素 ===")
# remove() - 删除指定值的元素
cities_copy = cities.copy()
print(f"删除前: {cities_copy}")
cities_copy.remove("上海")  # 删除特定值
print(f"remove后: {cities_copy}")

# pop() - 删除并返回指定位置的元素
popped = cities_copy.pop(1)  # 删除索引1的元素
print(f"pop索引1后: {cities_copy}, 弹出的元素: {popped}")
popped = cities_copy.pop()  # 不指定索引则删除最后一个元素
print(f"pop默认后: {cities_copy}, 弹出的元素: {popped}")

# del语句 - 删除指定位置的元素
del cities_copy[0]  # 删除第一个元素
print(f"del后: {cities_copy}")

# clear() - 清空列表
cities_copy.clear()
print(f"clear后: {cities_copy}")

# 6. 检查元素是否存在 - in 和 not in 操作符
print("\n=== 检查元素是否存在 ===")
print(f"'北京' 在 cities 中? {'北京' in cities}")
print(f"'南京' 不在 cities 中? {'南京' not in cities}")

# 7. 列表推导式
print("\n=== 列表推导式 ===")
# 生成1到10的平方数
squares = [x**2 for x in range(1, 11)]
# 等价于
# squares = []
# for x in range(1, 11):
#     squares.append(x**2)
print(f"1-10的平方: {squares}")

# 带条件的列表推导式
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
# 等价于
# even_squares = []
# for x in range(1, 11):
#     if x % 2 == 0:
#         even_squares.append(x**2)
print(f"偶数的平方: {even_squares}")

# 嵌套列表推导式
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
# 等价于
# flattened = []
# for row in matrix:
#     for num in row:
#         flattened.append(num)
print(f"展平的矩阵: {flattened}")

# 应用场景示例：数据转换
names = ["张三", "李四", "王五"]
greetings = [f"你好，{name}!" for name in names]
# 等价于
# greetings = []
# for name in names:
#     greetings.append(f"你好，{name}!")
print(f"问候语列表: {greetings}")
